/******************************************
Parqueo.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 15 de julio de 2009
Descripción:
*******************************************/
//package parqueos_stacks;

import java.lang.reflect.Array;
import java.util.Scanner;
import java.util.ArrayList;


public class Probando_Parqueo {
    private static int hacer;
    private static Scanner scan = new Scanner(System.in);
    private static int cant_est=1; //cantidad de estacionamientos
    private static ArrayList<Estacionamiento<Vehiculo>> Parqueos;
    private static ArrayList<String> nombres = new ArrayList<String>();
    private static ArrayList<String> placas = new ArrayList<String>();


    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {

        System.out.println("\n**************************************************\n");
        System.out.println("           Bienvenido al programa de Parqueo\n");
        System.out.println("**************************************************");
        System.out.println("\n* Nota: c/estacionamiento puede contener hasta 10 carros máximo");

        setCant_Estacionamientos(); //para definir cantidad de estacionamientos con los que cuenta el sistema de parqueo

        //ciclo para repetir hasta que quiera salir del programa
        do
        {
            Menu();
        } while (hacer!=5);//hasta que precione salir
        System.out.println("\n\n¡Gracias por utilizar el programa!");



    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {
            System.out.println("\n\t** Menu Principal del Parqueo **");
            System.out.println("1- Ingresar vehículo");
            System.out.println("2- Sacar vehículo");
            System.out.println("3- Ver todo el parqueo");
            System.out.println("4- Salir del Programa");
            System.out.print("\t¿Qué desea hacer?\tMarque el numero: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>4) &&(hacer!=-1))
                System.out.println("¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>4);

        //para realizar la accion marcada arriba
        switch (hacer)
        {
            case 1://  ********* INGRESAR VEHÍCULO ***********************************************

                for (int i=0;i<Parqueos.size();i++)
                {
                    if(Parqueos.get(i).full()!=true)//revisa si hay disponibles en el estacionamiento i
                    {
                        String temporal_placa="";
                        System.out.print("\nPor favor, ingrese los datos que se le solicitan\nIngrese su nombre: ");
                        String temporal_nombre=scan.nextLine();
                        temporal_nombre=temporal_nombre.toUpperCase();
                        nombres.add(temporal_nombre);
                        boolean Pasar=false;
                        System.out.println("Para llenar la placa siga el siguiente ejemplo: P123ABC");
                        do{
                            System.out.print("Ingrese placa: ");
                            temporal_placa= scan.nextLine();
                            temporal_placa=temporal_placa.toUpperCase();
                            placas.add(temporal_placa);
                            try{
                            if(temporal_placa.charAt(0)=='P'||temporal_placa.charAt(0)=='O'||temporal_placa.charAt(0)=='M')
                                if(Integer.parseInt(temporal_placa.substring(1,3))<=999)
                                    if(temporal_placa.length()==7)
                                        break;
                            System.out.println("******************* ERROR ************************\nIngresó de forma incorrecta la placa de su vehículo. Ejemplo: P123ABC\n");
                            placas.remove(placas.size()-1);
                            }catch(Exception exp){
                                System.out.println("******************* ERROR ************************\nIngresó de forma incorrecta la placa de su vehículo. Ejemplo: P123ABC\n");
                                placas.remove(placas.size()-1);
                            }
                        }while (Pasar==false);

                        //se coloca en el estacionamiento i el carro correspondiente
                        Parqueos.get(i).push(new Vehiculo(temporal_nombre,temporal_placa));
                        
                        System.out.println("\n\n************* Su vehículo ha sido parqueado en el estacionamiento: "+i+" *************");
                        break;
                    }
                    else if(i==(Parqueos.size()-1)){
                        System.out.println("\n\n************* Lo sentimos, ya no hay espacio en ningún estacionamiento ************");
                    }
                }

                break;
            case 2://  ********* SACAR VEHÍCULO **************************************************
                boolean paso=true;
                int seleccion=0;
                
                do{
                    paso=true;
                    System.out.print("Seleccione un número de estacionamiento en donde dejó su vehículo: ");
                    try{
                        seleccion=scan.nextInt();
                    }catch(Exception exp){
                        paso=false;
                    }
                    scan.nextLine();
                    if(seleccion<0 || seleccion>=cant_est) //solo puede ser u número entre 0 y cant_est
                        paso=false;
                }while (paso!=true);

                int estacionamiento_numero=seleccion;

                System.out.println("\nPor favor, seleccione en base a qué quiere sacar su vehículo:\n1- Nombre\n2- Placa");
                do{
                    paso=true;
                    System.out.print("Seleccione un número: ");
                    try{
                        seleccion=scan.nextInt();
                    }catch(Exception exp){
                        paso=false;
                    }
                    scan.nextLine();
                    if(seleccion!=1 && seleccion!=2)
                        paso=false;
                }while (paso!=true);


                if(seleccion==1){ //busqueda por nombre
                    System.out.print("\nIngrese el nombre: ");
                    String nombre= scan.nextLine();
                    nombre = nombre.toUpperCase();

                    ArrayList<Vehiculo> temporal= new ArrayList<Vehiculo>();

                    int cant=-1;

                    for(int i=0;i<nombres.size();i++)
                        if(nombres.get(i).compareTo(nombre)==0)
                        {
                            cant=i;
                            break;
                        }
                    //System.out.println(cant+"aaaaa");//TODO quietar esto...
                    cant=cant-10*(estacionamiento_numero);//-Parqueos.get(estacionamiento_numero).ultima_Posicion();
                    //System.out.println(cant+"aaaaa");//TODO quietar esto...
                    for(int i=Parqueos.get(estacionamiento_numero).ultima_Posicion();i>cant;i--){
                        if(i!=cant+1)
                            temporal.add(Parqueos.get(estacionamiento_numero).pop());
                        else
                            Parqueos.get(estacionamiento_numero).pop();
                    }
                    //System.out.println(Parqueos.get(estacionamiento_numero).toString());
                    int temporal2=temporal.size();
                    for(int i=0;i<temporal2;i++){
                        Parqueos.get(estacionamiento_numero).push(temporal.get(0));
                        temporal.remove(0);
                    }
                    System.out.println("Estacionamiento: "+estacionamiento_numero+"  "+Parqueos.get(estacionamiento_numero).toString());

                   
                }
                if(seleccion==2){ //busqueda por placa
                    System.out.print("\nIngrese la placa: ");
                    String nombre= scan.nextLine();
                    nombre = nombre.toUpperCase();

                    ArrayList<Vehiculo> temporal= new ArrayList<Vehiculo>();

                    int cant=-1;

                    for(int i=0;i<placas.size();i++)
                        if(placas.get(i).compareTo(nombre)==0)
                        {
                            cant=i;
                            break;
                        }
                    //System.out.println(cant+"aaaaa");//TODO quietar esto...
                    cant=cant-10*(estacionamiento_numero);//-Parqueos.get(estacionamiento_numero).ultima_Posicion();
                    //System.out.println(cant+"aaaaa");//TODO quietar esto...
                    for(int i=Parqueos.get(estacionamiento_numero).ultima_Posicion();i>cant;i--){
                        if(i!=cant+1)
                            temporal.add(Parqueos.get(estacionamiento_numero).pop());
                        else
                            Parqueos.get(estacionamiento_numero).pop();
                    }
                    //System.out.println(Parqueos.get(estacionamiento_numero).toString());
                    int temporal2=temporal.size();
                    for(int i=0;i<temporal2;i++){
                        Parqueos.get(estacionamiento_numero).push(temporal.get(0));
                        temporal.remove(0);
                    }
                    System.out.println("Estacionamiento: "+estacionamiento_numero+"  "+Parqueos.get(estacionamiento_numero).toString());
                }

                break;
           case 3://  ********** VER PARQUEO *****************************************************

                String imprimir="\n*****************************************************\n";
                imprimir+="                    Fondo......................Tope\n";
                for(int i=0;i<cant_est;i++)
                {
                   imprimir+="Estacionamiento: "+i+"  "+((Parqueos.get(i).toString()))+"\n";
                }
                imprimir+="\n****** Nomenclatura:    |OC| = Ocupado  |--|= Vacio ***************\n";
                System.out.println(imprimir);
                break;
        }
    }

    // método para setear la cantidad de estacionamientos que desea el usuario
    public static void setCant_Estacionamientos()
    {
        boolean pasar; // para hacer las diferentes validaciones

        do{ //ciclo para escribir cantidad de estacionamientos
            pasar=true;
            Scanner scan= new Scanner(System.in);
            System.out.print("\n>>Defina cuántos estacionamientos va a tener su parqueo: ");
            try{
                cant_est=scan.nextInt();
            }catch(Exception ex){
                pasar=false;
                System.out.println("******************* ERROR ************************\nIngresó algo que no es un número, por favor, vuelva a ingresarlo\n");
            }
            if(cant_est<0) {
                pasar=false;
                System.out.println("******************* ERROR ************************\nIngresó un número negativo, por favor, vuelva a ingresarlo\n");
            }
            else if(cant_est==0) {
                pasar=false;
                System.out.println("********************************** ERROR **********************************\nNo puede ingresar cero, por favor, vuelva a ingresarlo\n");
            }
        }while(pasar==false);

        Parqueos = new ArrayList<Estacionamiento<Vehiculo>>();
        //ciclo para crear los n estacionamientos
        for (int i=0;i<cant_est;i++){
            Parqueos.add(new Estacionamiento());
        }
    }


}

